package main

import (
	"fmt"
	"time"
)

/*
	select结构类似于switch语句，但它的case只能引用通信操作（对chan的读取和写入操作）
	当需要从多个chan中读取或写入时，会先轮询一遍所有的case，
	然后在所有处于就绪（可读/可写）的chan中随机挑选一个进行读取或写入操作，并执行其语句块
	如果所有case都未就绪，则执行default，如未提供default语句，则当前协程被阻塞

	如果某个
*/

func main() {
	intChan := make(chan int, 10)
	for i := 0; i < 10; i++ {
		intChan <- i
	}
	close(intChan)

	stringChan := make(chan string, 5)
	for i := 0; i < 5; i++ {
		stringChan <- "hello" + fmt.Sprintf("%d", i)
	}
	close(stringChan)

	// 使用select来获取channel里面的数据时不需要关闭channel
	for {
		select {
		case v, ok := <-intChan:
			fmt.Printf("从 intChan 读取的数据%v, %v\n", v, ok)
			if ok == false {
				intChan = nil
			}
			time.Sleep(time.Millisecond * 50)
		case v, ok := <-stringChan:
			fmt.Printf("从 stringChan 读取数据%v, %v\n", v, ok)
			time.Sleep(time.Millisecond * 50)
		default:
			fmt.Printf("等待管道就绪...\n")
			time.Sleep(time.Millisecond * 50)
		}
	}
}
